/*
//*****************************************************************
CONFIGURACION PARA TARJETA: BASE30F6010

Tres controles de posici n.

Entradas analogas para 
potenciometros:								corriente:

RB8 - AN8	para pwm1						RB0 -  AN0 
RB9 - AN9	para pwm2						RB1 -  AN1
RB10- AN10	para pwm3						RB2 -  AN2
RB11- AN11	para pwm4.						RB3 - AN3


//*****************************************************************
//  Camilo Otalora
//  Agosto-13-2005
//* Este programa control  para tres motores 		*
//* Entradas: poteciometros ANA0, ANA1, ANA2, ANA3			  	*	
//* El periodo de muestreo se fija con el timer 3.				*
//* Reloj principal de 10 Mhz para usar con PLLx8 				*
//* Se utiliza timer 1 para generar eventos 
//* transmisi n de datos por USART
//
//TARJETA PRINCIPAL_MAIN

//*****************************************************************
*/
#define dataarray 0x1820

#include <stdio.h>
#include "p30F6010.h"
 
/*  rutinas de configuracion */

void vCarrilloInitPorts(void);						// inicializacion de puertos
void vCarrilloInitTimer1(void);
void vCarrillloMostrarResultados (void);				/* FUNCION QUE MUESRA LOS RESULTADOS DEL MODULO ADC */

// VARIABLES
int count1
signed int t_SP;

/*****************************************************************************
Definiciones para manejo de USART
*/

extern char cAmarantaUartRxBufferIndex; 
extern char cAmarantaUartTxBufferIndex; 
extern char cAmarantaExecuteCommand;  

extern char pcAmarantaUartBufferRx[16];
extern char pcAmarantaUartBufferTx[16];
extern int unsigned int uiAmarantaAdcResul, puiAmarantaAdcResultadoCanalAdc[4]; /* BANDERA QUE AVISA DE UN NUEVO RESULTADO EN EL ADC - BUFFER QUE ALMACENA EL REULTADO DEL ADC */
extern unsigned int PATA_1;
extern unsigned int PATA_2;
extern unsigned int PATA_3;
extern unsigned int PATA_4;
//******************************************************************************

int __xmain(void)
{
	char i,j,k;
	
	vCarrilloInitPorts();		
	vSerialConfigUSART1();
	init_pwms();
	init_adc();
	//init_timer2();
	init_can1();     
	
	pcAmarantaUartBufferTx[0]='M';
	pcAmarantaUartBufferTx[1]='A';
	pcAmarantaUartBufferTx[2]='I';
	pcAmarantaUartBufferTx[3]='N';
	vAmarantaSerialTxDat(4);

	while(1)
	{
		if(uiAmaranteAdcResul)
			mostrar_resultados();	
		
		if(cAmarantaExecuteCommand==1)
		{
			if(pcAmarantaUartBufferRx[0]=='P' && cAmarantaUartRxBufferIndex>=7)	// test PNSXXXX, N motor=1,2,3,4, S signo , XXXX pwm 
			{
				i=(pcAmarantaUartBufferRx[1]&0x0f);
				
				t_SP=(pcAmarantaUartBufferRx[3]&0x0f)*10;
				t_SP=(t_SP+(pcAmarantaUartBufferRx[4]&0x0f))*10;
				t_SP=(t_SP+(pcAmarantaUartBufferRx[5]&0x0f))*10;
				t_SP=t_SP+(pcAmarantaUartBufferRx[6]&0x0f);		// .

				if (pcAmarantaUartBufferRx[2]=='-')
					t_SP=-t_SP; // posicion negativa.
				
				set_pwm(i,t_SP);
				
			}
	
			cAmarantaUartRxBufferIndex=0;
			sprintf(pcAmarantaUartBufferTx,"ok\n\r");		// test
			vSerialTxDatTxDat(4);
			cAmarantaExecuteCommand=0;
		}
	}

}


void vCarrilloInitPorts(void)  // configuracion de I_O ports
{
	TRISD=0xfff0;  // d0..3 salida. 
}

void vCarrilloInitTimer1(void) //ok
{
	T1CON=0;                 //  prescaler 0,reloj interno fosc/4=20 Mhz.
    	TMR1=0;                  //  Ensure timer1  reset
	PR1=2000;                // para INT cada 100uS clk=80MHZ.
	IFS0bits.T1IF=0;         // Reset timer1 interrupt flag	
	INTCON1bits.NSTDIS=0;    // habilita int. nesting
	IEC0bits.T1IE=1;		 // habilita int TIMER1.
	T1CONbits.TON=1;		 // enciende timer 1.
}

/*RUTINA QUE ALMACENA LOS RESULTADOS DEL MODULO ADC */
void vCarrilloMostrarResultados (void)
{
	int  i, res_adc[4];

	for(i=0;i<4;i++) 
		res_adc[i] = resultado_canal_adc[i];
		
	if(res_adc[1]>10)	
		PORTEbits.RE0=1;	/* SE GENERA UNA SE AL CUADRADA A PARTIR DE UNA SE AL SENO ENTRE 1 Y 50hz EN EL CANAL AN9 */
	
	else 
		PORTEbits.RE0=0;
	
	resul_adc=0;							/* SE LIMPIA LA BANDERA DE NUEVO RESULTADO EN EL ADC  */
}


